package com.zl.basic.CommonUtil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;

/**
 * User: zl email:c3tc3tc3t@126.com Date: 14-1-27 Time: 下午4:51
 */
public class EnumUtil {
  /**
   * 将枚举中的值转换专为一组序数列表
   * 
   * @param clz 枚举类class对象
   * @return 枚举实例序号list
   */
  public static List<Integer> enum2Ordianl(Class<? extends Enum> clz) {
    if (!clz.isEnum()) return null;
    Enum[] enums = clz.getEnumConstants();
    List<Integer> rels = new ArrayList<>();
    for (Enum e : enums) {
      rels.add(e.ordinal());
    }
    return rels;
  }

  /**
   * 将枚举中的值转化为一组字符串列表
   * 
   * @param clz 枚举类class对象
   * @return 枚举实例名称list
   */
  public static List<String> enum2Name(Class<? extends Enum> clz) {
    if (!clz.isEnum()) return null;
    Enum[] enums = clz.getEnumConstants();
    List<String> rels = new ArrayList<>();
    for (Enum e : enums) {
      rels.add(e.name());
    }
    return rels;
  }

  /**
   * 将枚举中的值转换为序号和名称map
   * 
   * @param clz 枚举类class对象
   * @return 枚举实例序号和实例名称map
   */
  public static Map<Integer, String> enum2Map(Class<? extends Enum> clz) {
    if (!clz.isEnum()) return null;
    Enum[] enums = clz.getEnumConstants();
    Map<Integer, String> rels = new HashMap<>();
    for (Enum e : enums) {
      rels.put(e.ordinal(), e.name());
    }
    return rels;
  }

  /**
   * 将枚举中某个属性转换为列表
   * 
   * @param clz 枚举类class对象
   * @param propName 某个属性名
   * @return 属性值list
   */
  public static List<String> enumProp2List(Class<? extends Enum> clz, String propName) {
    if (!clz.isEnum()) return null;
    try {
      Enum[] enums = clz.getEnumConstants();
      List<String> rels = new ArrayList<>();
      for (Enum e : enums) {
        rels.add((String) PropertyUtils.getProperty(e, propName));
      }
      return rels;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }

  /**
   * 将枚举中的属性转换为序号和属性值map
   * 
   * @param clz 枚举类class对象
   * @param propName 属性名称
   * @return 序号和属性值map
   */
  public static Map<Integer, String> enumProp2OrdinalMap(Class<? extends Enum> clz, String propName) {
    if (!clz.isEnum()) return null;
    try {
      Enum[] enums = clz.getEnumConstants();
      Map<Integer, String> rels = new HashMap<>();
      for (Enum e : enums) {
        rels.put(e.ordinal(), (String) PropertyUtils.getProperty(e, propName));
      }
      return rels;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }

  /**
   * 将枚举中两个 属性转换为map键值对
   * 
   * @param keyProp 作为key属性名称
   * @param clz 枚举类class对象
   * @param valueProp 作为value的属性名称
   * @return 属性键值对map
   */
  public static Map<String, String> enumProp2Map(Class<? extends Enum> clz, String keyProp,
      String valueProp) {
    if (!clz.isEnum()) return null;
    try {
      Enum[] enums = clz.getEnumConstants();
      Map<String, String> rels = new HashMap<>();
      for (Enum e : enums) {
        rels.put((String) PropertyUtils.getProperty(e, keyProp),
            (String) PropertyUtils.getProperty(e, valueProp));
      }
      return rels;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }

  /**
   * 转换枚举中实例名称和属性值为map
   * 
   * @param clz 枚举类class对象
   * @param propName 属性名称
   * @return 枚举实例名和属性值map
   */
  public static Map<String, String> enumProp2NameMap(Class<? extends Enum> clz, String propName) {
    if (!clz.isEnum()) return null;
    try {
      Enum[] enums = clz.getEnumConstants();
      Map<String, String> rels = new HashMap<>();
      for (Enum e : enums) {
        rels.put(e.name(), (String) PropertyUtils.getProperty(e, propName));
      }
      return rels;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }
}
